X-Git-Url: https://git.r.bdr.sh/rbdr/super-polarity/blobdiff_plain/2af83e98005a14c439b360a5b9ac636f594d9f0c..b587e9d8e0cc5eb1edf972fd3b644704441e5289:/Super%20Polarity/Actors/MainShip.cs diff --git a/Super Polarity/Actors/MainShip.cs b/Super Polarity/Actors/MainShip.cs index 851c658..9f28c80 100644 --- a/Super Polarity/Actors/MainShip.cs +++ b/Super Polarity/Actors/MainShip.cs @@ -2,44 +2,71 @@ using System.Collections.Generic; using System.Linq; using System.Text; +using System.Threading; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Content; using Microsoft.Xna.Framework.Graphics; +using Microsoft.Xna.Framework.Audio; namespace SuperPolarity { class MainShip : Ship { - - uint Multiplier; - uint Lives; - uint Score; + + public static Color BlueColor; + public static Color RedColor; + ParticleEngine particleEngine; - public MainShip(Game newGame) : base(newGame) {} + protected bool Shooting; + protected int ShotCooldown; + + protected float CurrentImmortalTime; + protected float MaxImmortalTime; + protected bool Flashing; + + protected SoundEffect PolarityChange; + protected SoundEffect ShootSound; + protected SoundEffect Hit; + + public MainShip(SuperPolarity newGame) : base(newGame) {} + + ~MainShip() + { + particleEngine = null; + } public override void Initialize(Texture2D texture, Vector2 position) { base.Initialize(texture, position); + MainShip.BlueColor = new Color(0, 184, 229); + MainShip.RedColor = new Color(201, 0, 68); + + PolarityChange = game.Content.Load("Sound\\polaritychange"); + ShootSound = game.Content.Load("Sound\\bullet"); + Hit = game.Content.Load("Sound\\hit"); + InitParticleEngine(); SetPolarity(Polarity.Positive); - Multiplier = 1; - Lives = 3; - Score = 0; + ActVelocity = 2.5f; + + ShotCooldown = 50; + MaxImmortalTime = 1500; + + BoxDimensions.X = 2; + BoxDimensions.Y = 2; + BoxDimensions.W = 2; + BoxDimensions.Z = 2; + InitBox(); BindInput(); } void InitParticleEngine() { - List texturesList = new List(); - texturesList.Add(game.Content.Load("Graphics\\circle")); - texturesList.Add(game.Content.Load("Graphics\\diamond")); - texturesList.Add(game.Content.Load("Graphics\\star")); - - particleEngine = new ParticleEngine(texturesList, Position); + particleEngine = ParticleEffectFactory.CreatePolarCircle(Position); } void BindInput() @@ -47,6 +74,33 @@ namespace SuperPolarity InputController.Bind("moveX", HandleHorizontalMovement); InputController.Bind("moveY", HandleVerticalMovement); InputController.Bind("changePolarity", HandleChangePolarity); + InputController.Bind("shoot", HandleShot); + } + + protected void HandleShot(float value) + { + + Shooting = true; + Timer t = new Timer(new TimerCallback(UnlockShot)); + t.Change(ShotCooldown, Timeout.Infinite); + + if (Children.Count > 10) + { + return; + } + + var bullet = ActorFactory.CreateBullet(Position, Angle); + + Children.Add(bullet); + bullet.Parent = this; + + ShootSound.Play(); + } + + protected void UnlockShot(object state) + { + InputController.Unlock("shoot"); + Shooting = false; } protected void HandleChangePolarity(float value) @@ -56,28 +110,30 @@ namespace SuperPolarity public void HandleHorizontalMovement(float value) { - Acceleration.X = value * AccelerationRate; - - if (value > 0.1 && Velocity.X < 0 || value < 0.1 && Velocity.X > 0) + if (value >= -0.5 && value <= 0.5) { - Acceleration.X *= 2; + value = 0; } - if (value > 0.1 && Velocity.Y < 0 || value < 0.1 && Velocity.Y > 0) - { - Acceleration.Y *= 2; - } + Velocity.X = value * MaxVelocity; } public void HandleVerticalMovement(float value) { - Acceleration.Y = value * AccelerationRate; + if (value >= -0.5 && value <= 0.5) + { + value = 0; + } + + Velocity.Y = value * MaxVelocity; } public override void SwitchPolarity() { base.SwitchPolarity(); SwitchParticleEngine(CurrentPolarity); + PolarityChange.Play(); + game.Player.ResetMultiplier(); } public override void SetPolarity(Polarity newPolarity) @@ -90,11 +146,11 @@ namespace SuperPolarity { if (polarity == Polarity.Positive) { - particleEngine.Color = Color.Red; + particleEngine.Color = MainShip.RedColor; } else if (polarity == Polarity.Negative) { - particleEngine.Color = Color.Blue; + particleEngine.Color = MainShip.BlueColor; } else { @@ -108,6 +164,66 @@ namespace SuperPolarity particleEngine.EmitterLocation = Position; particleEngine.Update(); ConstrainToEdges(); + UpdateImmortality(gameTime); + } + + public void UpdateImmortality(GameTime gameTime) + { + if (Immortal) + { + CurrentImmortalTime += gameTime.ElapsedGameTime.Milliseconds; + + if (Flashing) + { + Color = new Color(255, 255, 255, 128); + } + else + { + Color = Color.White; + } + + Flashing = !Flashing; + + if (CurrentImmortalTime > MaxImmortalTime) + { + Immortal = false; + Color = Color.White; + } + } + } + + public override void Move(GameTime gameTime) + { + var VelocityLimit = MaxVelocity; + var SavedVelocity = new Vector2(Velocity.X, Velocity.Y); + + if (Shooting) + { + VelocityLimit = ActVelocity; + } + + if (SavedVelocity.X > VelocityLimit) + { + SavedVelocity.X = VelocityLimit; + } + + if (SavedVelocity.X < -VelocityLimit) + { + SavedVelocity.X = -VelocityLimit; + } + + if (SavedVelocity.Y > VelocityLimit) + { + SavedVelocity.Y = VelocityLimit; + } + + if (SavedVelocity.Y < -VelocityLimit) + { + SavedVelocity.Y = -VelocityLimit; + } + + Position.X = Position.X + SavedVelocity.X; + Position.Y = Position.Y + SavedVelocity.Y; } public override void Magnetize(Ship ship, float distance, float angle) @@ -159,5 +275,40 @@ namespace SuperPolarity particleEngine.Draw(spriteBatch); base.Draw(spriteBatch); } + + public override void Collide(Actor other, Rectangle collision) + { + if (other.GetType().IsAssignableFrom(typeof(StandardShip)) && + !Immortal) + { + Die(); + } + } + + protected override void Die() + { + game.Player.Lives = game.Player.Lives - 1; + game.Player.ResetMultiplier(); + if (game.Player.Lives < 0) + { + Dying = true; + game.GameOver(); + } + else { + Hit.Play(); + Immortal = true; + CurrentImmortalTime = 0; + } + } + + public override void CleanUp() + { + base.CleanUp(); + particleEngine = null; + InputController.Unbind("moveX", HandleHorizontalMovement); + InputController.Unbind("moveY", HandleVerticalMovement); + InputController.Unbind("changePolarity", HandleChangePolarity); + InputController.Unbind("shoot", HandleShot); + } } }